<%@ Page Language="C#" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<%@ Import Namespace="System.Configuration" %>

<script runat="server">
    protected void Page_Load(object sender, EventArgs e)
    {
        SqlConnection DBCon;
        SqlCommand OrdersCommand = new SqlCommand();
        SqlCommand CustCommand = new SqlCommand();
        SqlDataReader OrdersReader;
        SqlDataReader CustReader;
        IAsyncResult OrdersASyncResult;
        IAsyncResult CustAsyncResult;

        int WHIndex;
        System.Threading.WaitHandle[] WHandles = 
           new System.Threading.WaitHandle[2];
        System.Threading.WaitHandle OrdersWHandle;
        System.Threading.WaitHandle CustWHandle;

        DBCon = new SqlConnection();
        DBCon.ConnectionString =             
          ConfigurationManager.ConnectionStrings["DSN_NorthWind"].ConnectionString;

        CustCommand.CommandText = 
           "SELECT * FROM Customers WHERE CompanyName = 'Alfreds Futterkiste'";

        CustCommand.CommandType = CommandType.Text;
        CustCommand.Connection = DBCon;

        OrdersCommand.CommandText = 
                "SELECT Customers.CompanyName, Customers.ContactName, " +
                "Orders.OrderID, Orders.OrderDate, " +
                "Orders.RequiredDate, Orders.ShippedDate " +
                "FROM Orders, Customers " +
                "WHERE Orders.CustomerID = Customers.CustomerID " +
                "AND Customers.CompanyName = 'Alfreds Futterkiste' " +
                "ORDER BY Customers.CompanyName, Customers.ContactName";

        OrdersCommand.CommandType = CommandType.Text;
        OrdersCommand.Connection = DBCon;

        // Otwarcie poczenia z baz danych
        DBCon.Open();

        // Asynchroniczne pobranie informacji o kliencie
        CustAsyncResult = CustCommand.BeginExecuteReader();

        // Asynchroniczne pobranie listy zamwie
        OrdersASyncResult = OrdersCommand.BeginExecuteReader();

        CustWHandle = CustAsyncResult.AsyncWaitHandle;
        OrdersWHandle = OrdersASyncResult.AsyncWaitHandle;

        // Uzupenienie tablicy uchwytw dwoma uchwytami, ktre
        // zamierzamy wykorzysta w tym kodzie
        WHandles[0] = CustWHandle;
        WHandles[1] = OrdersWHandle;

        // Wykonujemy ca ptl dwa razy, bo mamy
        // dwa elementy w tablicy
        for (int Index = 0; Index < 2; Index++ )
        {
            // Czekamy na zakoczenie wykonywania si tylko
            // jednego procesu asynchronicznego
            WHIndex = System.Threading.WaitHandle.WaitAny(WHandles);

            // Wartoci zwracan metody WaitAny
            // jest indeks w tablicy uchwytu, ktry
            // reprezentuje zakoczony proces
            switch (WHIndex)
            {
                case 0:
                    CustReader = CustCommand.EndExecuteReader(CustAsyncResult);

                    gvCustomers.DataSource = CustReader;
                    gvCustomers.DataBind();
                    break;
                case 1:
                    OrdersReader = 
                       OrdersCommand.EndExecuteReader(OrdersASyncResult);

                    gvOrders.DataSource = OrdersReader;
                    gvOrders.DataBind();
                    break;
            }
        }
        // Zamykanie poczenia
        DBCon.Close();
    }
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
    <title>Technika WaitAny</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <asp:GridView ID="gvCustomers" Width="100%" runat="server"></asp:GridView>
    <br /><br />
    <asp:GridView ID="gvOrders" Width="100%" AutoGenerateColumns="False"         
     runat="server">
       <Columns>
          <asp:BoundField HeaderText="Nazwa firmy" 
           DataField="CompanyName"></asp:BoundField>
          <asp:BoundField HeaderText="Kontakt" 
           DataField="ContactName"></asp:BoundField>
          <asp:BoundField HeaderText="Data zamwienia" DataField="orderdate" 
           DataFormatString="{0:d}"></asp:BoundField>
          <asp:BoundField HeaderText="Wymagana data dostawy" DataField="requireddate" 
           DataFormatString="{0:d}"></asp:BoundField>
          <asp:BoundField HeaderText="Data dostawy" DataField="shippeddate" 
           DataFormatString="{0:d}"></asp:BoundField>
       </Columns>
    </asp:GridView>
    </div>
    </form>
</body>
</html>
